#include "MatrixLED.h"
#include "DelayTime.h"

// 对74HC595相关寄存器，重命名
sbit _SER = P3^4;
sbit _RCLK = P3^5; // 寄存器时钟
sbit _SRCLK = P3^6; // 串行时钟

void _74HC595_Init()
{
	_RCLK = 0;
	_SRCLK = 0;
}

//// 向74HC595写入 一个字节的数据
void _74HC595_WriteByte(unsigned char datas)
{
	//1. 将data数据高位移动到移位寄存器内
	//   每写入一个比特位，控制给寄存器时钟一个高电平，控制SER数据向下移动一位
	//    先要赋值高位 1000 0000 0x80
	//SER = (datas & 0x80); // 获取高位
	
	// 从高到低依次获取
	int i;
	for(i = 0; i < 8; i++)
	{
			_SER = datas & (0x80 >> i);
			_SRCLK = 1; // 给寄存器时钟一个上升沿，让SER数据向下移动
			_SRCLK = 0; // 复原
	}
	// 写完一个字节的数据，将数据刷新到输出缓冲
		_RCLK = 1; 
		_RCLK = 0; 
}


// col控制列，datas 通过 74HC595给 当前列的每个进行赋值
// col -> [0,7] --> [P0_7,P0_0]
void MatrixLED_ShowColumn(unsigned char col,unsigned char datas)
{
	// 必须先是段选，再是位选
	//  1. 段选，先给每一列SER写入数据
	_74HC595_WriteByte(datas);
	// 2. 位选， 通过col，选中第col列有效 -- 给0有效，1无效
	P0 = ~(0x80 >> col);
	// 不记得了看动态数码管部分
	Delayxms(1);
	// 消除残影
	P0 = 0xff;

}

